﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Ext.Net;
using Sio.Mdm.Entities;
using Sio.Mdm.BF.Ldap;
using Sio.Mdm.Types.Database;
using Sio.Mdm.Client;
using Sio.Mdm.Types;

namespace Sio.Mdm.Web.Instalacija
{
    public partial class LdapStreznikiSeznam : Controls.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack && !X.IsAjaxRequest)
            {
                LoadLdapTipi();
                NaloziSeznamGrida(e);
            }
        }

        #region Private
        private void NaloziSeznamGrida(EventArgs arg)
        {
            GridStreznikiSeznam.LoadData<LdapStreznikRazsirjeno>(
                new Filter<LdapStreznikRazsirjeno>().Where(r => r.LdapStreznikID != null).OrderBy(r => r.Ime));            
        }

        private void LoadLdapTipi()
        {
            Dictionary<int, string> listSpoli = new Dictionary<int, string>();
            listSpoli.Add(0, "AD");
            listSpoli.Add(1, "LDAP");
            var tmpArray = (from p in listSpoli select new Object[2] { p.Key, p.Value }).ToArray();
            
            StoreLdapTipi.DataSource = tmpArray;
            StoreLdapTipi.DataBind();
        }

        #endregion

        #region OdstraniZapise
        protected void OdstraniZapise(object sender, DirectEventArgs e)
        {
            List<int> selectedItems = e.GetIdList<int>("selected", "LdapStreznikID");
            int deleted = 0;
            foreach (int streznikId in selectedItems)
            {
                LdapStreznik streznik = EntityFactory.LoadEntity<LdapStreznik>(
                new Filter<LdapStreznik>().Where(r => r.LdapStreznikID == streznikId));

                string references = CheckReferences(streznikId);
                if (!String.IsNullOrEmpty(references)) {
                    references = String.Format("<b>Strežnik '{0}', je v uporabi in ga ni mogoče izbrisati!</b><br><br> Uporaba v: {1}", streznik.Ime, references);
                    ShowExtMessageBox("Opozorilo",references);
                    return;
                }

                streznik.Delete();
                deleted++;                
            }

            if (deleted > 0)
            {
                StoreStreznikiSeznam.DataBind();
                ShowExtNotification("Brisanje", String.Format("Brisanje je bilo uspešno. <br><br>Število izbrisanih zapisov: {0}.", deleted));
            }
        }
        #endregion

        private string CheckReferences(int StreznikID)
        {
            string references = "";
            EntityCollection<LdapPravilo> pravila = new EntityCollection<LdapPravilo>(new Filter<LdapPravilo>().Where(p => p.LdapStreznikID == StreznikID));

            foreach (LdapPravilo pravilo in pravila)
            {
                if (!String.IsNullOrEmpty(references)) references+= ", ";
                references += String.Format("Pravilo: '{0}'", pravilo.Ime);
            }

            EntityCollection<LdapSkupinaStoritev> skupineStoritve = new EntityCollection<LdapSkupinaStoritev>(new Filter<LdapSkupinaStoritev>().Where(p => p.StoritevKljuc == StreznikID));
            foreach (LdapSkupinaStoritev skupinaStoritev in skupineStoritve)
            {
                if (!String.IsNullOrEmpty(references)) references += ", ";
                references += String.Format("Skupina: '{0}'", skupinaStoritev.SkupinaNaziv);
            }

            return references;
        }
        
        #region TestConnection
        protected void TestConnection(object sender, DirectEventArgs e)
        {
            List<int> selectedItems = e.GetIdList<int>("selected", "LdapStreznikID");
            if (selectedItems.Count != 1) {
                ShowExtMessageBox("Opozorilo", "Prosimo izberite natanko en strežnik!");
                return;
            }

            if (selectedItems.Count == 1)
            { 
                var slServiceLdap = ServiceFactory.GetService<ILdapService>();
                Result result = slServiceLdap.TestConnection(selectedItems[0], UserSession);
                if (result != null) {                    
                    string error = string.Format("<b>Prišlo je do napake pri povezavi s strežnikom!</b><br><br>Opis: {0}", result.Message);
                    ShowExtMessageBox("Napaka", error);
                    return;
                }
                ShowExtNotification("Povezava", "Povezava s strežnikom je bila uspešna.");
            }

        }
        #endregion
    }
}
